#include "AT24C02.h"
#include "I2C.h"

//地址格式：器件特征地址（1010）+3位编码+0
#define AT24_Addr   0xA0      //读取时的地址
/********************************************************************
*    函数原型: void AT24C_WriteByte(unsigned char addr,unsigned char Data)
*    功    能: MCU向AT24Cxx发送1字节数据,存储于地址addr处
*    备    注：addr：AT24Cxx内部的存储地址
********************************************************************/
void AT24C_WriteByte(unsigned char addr,unsigned char Data)
{
  I2C_start();
  I2C_Send7bitAddr(AT24_Addr,I2C_WR);//写入器件地址
  I2C_CheckAck();
  I2C_SendByte(addr);//写入存储地址
  I2C_CheckAck();
  I2C_SendByte(Data);//写入存储数据
  I2C_CheckAck();
  I2C_stop();
}
/********************************************************************
*    函数原型: void AT24C_Write(unsigned char addr,unsigned char Data)
*    功    能: MCU向AT24Cxx发送n字节数据,存储地址从addr处开始
*    备    注：addr：AT24Cxx内部的存储地址
********************************************************************/
void AT24C_Write(unsigned char addr,unsigned char *array,unsigned char num)
{
  unsigned char i;
  I2C_start();
  I2C_Send7bitAddr(AT24_Addr,I2C_WR);//写入器件地址
  I2C_CheckAck();
  I2C_SendByte(addr);//写入存储地址
  I2C_CheckAck();
  for(i=0;i<num;i++)
  {
		  I2C_SendByte(array[i]);//写入存储数据
		  I2C_CheckAck();
  }
  I2C_stop();
}

/********************************************************************
*    函数原型: unsigned char AT24C_ReadByte(unsigned char addr)
*    功    能: MCU随机读取位于地址addr处的1字节的AT24Cxx数据
*    备    注：addr：AT24Cxx内部的存储地址
********************************************************************/
unsigned char AT24C_ReadByte(unsigned char addr)
{
  unsigned char Data;
  I2C_start();
  I2C_Send7bitAddr(AT24_Addr,I2C_WR);//写入器件地址
  I2C_CheckAck();
  I2C_SendByte(addr);//写入存储地址
  I2C_CheckAck();
  I2C_stop();
  /*****************/
  I2C_start();
  I2C_Send7bitAddr(AT24_Addr,I2C_RD);//写入器件地址
  I2C_CheckAck();
  Data=I2C_RcvByte();
  I2C_NoAck();
  I2C_stop();
  return Data;
}
/********************************************************************
*    函数原型: void AT24C_Read(unsigned char addr,unsigned char *array,unsigned char num)
*    功    能: MCU随机读取从地址addr处开始的n字节的AT24Cxx数据
*    备    注：addr：AT24Cxx内部的存储地址
*
********************************************************************/
void AT24C_Read(unsigned char addr,unsigned char *array,unsigned char num)
{
  unsigned char i;
  I2C_start();
  I2C_Send7bitAddr(AT24_Addr,I2C_WR);//写入器件地址
  I2C_CheckAck();
  I2C_SendByte(addr);//写入存储地址
  I2C_CheckAck();
  I2C_stop();
  /****************/ 
  for(i=0;i<num;i++)
  {
		  I2C_start(); 
		  I2C_Send7bitAddr(AT24_Addr,I2C_RD);//写入器件地址
		  I2C_CheckAck();
		  array[i]=I2C_RcvByte();//读取存储数据
		  I2C_NoAck();
		  I2C_stop();			  
  }	  
}
/********************************************************************
*    函数原型: void WaitforEepromStandBy(void)
*    功    能: 等待EEPROM处于空闲准备状态
*    备    注：用于写操作之后
********************************************************************/
void AT24C_WaitforEepromStandBy(void)
{
	unsigned char i=255;
	do
	{
      i--;
	  I2C_start();
      I2C_Send7bitAddr(AT24_Addr,I2C_WR);//写入器件地址     
	}while((I2C_CheckAck()==nack)&&i>0);
	I2C_stop();
}
